package com.springcloud.log.modular.log.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.springcloud.commom.api.ResultCode;
import com.springcloud.commom.exception.ServiceException;
import com.springcloud.commom.factory.PageFactory;
import com.springcloud.commom.page.PageResult;
import com.springcloud.log.entity.SysOpLog;
import com.springcloud.log.modular.log.mapper.SysOpLogMapper;
import com.springcloud.log.modular.log.service.SysOpLogService;
import com.springcloud.log.param.OpLogParam;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 系统操作日志表service接口实现类
 *
 * @author hzl
 * @date 2024-07-23 09:58:00
 */
@Service
public class SysOpLogServiceImpl extends ServiceImpl<SysOpLogMapper, SysOpLog> implements SysOpLogService {

    @Override
    public PageResult<SysOpLog> page(OpLogParam opLogParam) {
        QueryWrapper<SysOpLog> queryWrapper = new QueryWrapper<>();
        if (ObjectUtil.isNotNull(opLogParam)) {

            // 根据名称 查询
            if (ObjectUtil.isNotEmpty(opLogParam.getName())) {
                queryWrapper.lambda().eq(SysOpLog::getName, opLogParam.getName());
            }
            // 根据操作类型 查询
            if (ObjectUtil.isNotEmpty(opLogParam.getOpType())) {
                queryWrapper.lambda().eq(SysOpLog::getOpType, opLogParam.getOpType());
            }
            // 根据是否执行成功（Y-是，N-否） 查询
            if (ObjectUtil.isNotEmpty(opLogParam.getSuccess())) {
                queryWrapper.lambda().eq(SysOpLog::getSuccess, opLogParam.getSuccess());
            }
            // 根据具体消息 查询
            if (ObjectUtil.isNotEmpty(opLogParam.getMessage())) {
                queryWrapper.lambda().eq(SysOpLog::getMessage, opLogParam.getMessage());
            }
            // 根据ip 查询
            if (ObjectUtil.isNotEmpty(opLogParam.getIp())) {
                queryWrapper.lambda().eq(SysOpLog::getIp, opLogParam.getIp());
            }
            // 根据地址 查询
            if (ObjectUtil.isNotEmpty(opLogParam.getLocation())) {
                queryWrapper.lambda().eq(SysOpLog::getLocation, opLogParam.getLocation());
            }
            // 根据浏览器 查询
            if (ObjectUtil.isNotEmpty(opLogParam.getBrowser())) {
                queryWrapper.lambda().eq(SysOpLog::getBrowser, opLogParam.getBrowser());
            }
            // 根据操作系统 查询
            if (ObjectUtil.isNotEmpty(opLogParam.getOs())) {
                queryWrapper.lambda().eq(SysOpLog::getOs, opLogParam.getOs());
            }
            // 根据请求地址 查询
            if (ObjectUtil.isNotEmpty(opLogParam.getUrl())) {
                queryWrapper.lambda().eq(SysOpLog::getUrl, opLogParam.getUrl());
            }
            // 根据类名称 查询
            if (ObjectUtil.isNotEmpty(opLogParam.getClassName())) {
                queryWrapper.lambda().eq(SysOpLog::getClassName, opLogParam.getClassName());
            }
            // 根据方法名称 查询
            if (ObjectUtil.isNotEmpty(opLogParam.getMethodName())) {
                queryWrapper.lambda().eq(SysOpLog::getMethodName, opLogParam.getMethodName());
            }
            // 根据请求方式（GET POST PUT DELETE) 查询
            if (ObjectUtil.isNotEmpty(opLogParam.getReqMethod())) {
                queryWrapper.lambda().eq(SysOpLog::getReqMethod, opLogParam.getReqMethod());
            }
            // 根据请求参数 查询
            if (ObjectUtil.isNotEmpty(opLogParam.getParam())) {
                queryWrapper.lambda().eq(SysOpLog::getParam, opLogParam.getParam());
            }
            // 根据返回结果 查询
            if (ObjectUtil.isNotEmpty(opLogParam.getResult())) {
                queryWrapper.lambda().eq(SysOpLog::getResult, opLogParam.getResult());
            }
            // 根据操作时间 查询
            if (ObjectUtil.isNotEmpty(opLogParam.getOpTime())) {
                queryWrapper.lambda().eq(SysOpLog::getOpTime, opLogParam.getOpTime());
            }
            // 根据操作账号 查询
            if (ObjectUtil.isNotEmpty(opLogParam.getAccount())) {
                queryWrapper.lambda().eq(SysOpLog::getAccount, opLogParam.getAccount());
            }
        }
        return new PageResult<>(this.page(PageFactory.defaultPage(), queryWrapper));
    }

    @Override
    public List<SysOpLog> list(OpLogParam opLogParam) {
        return this.list();
    }

    @Override
    public void add(OpLogParam opLogParam) {
        SysOpLog sysOpLog = new SysOpLog();
        BeanUtil.copyProperties(opLogParam, sysOpLog);
        this.save(sysOpLog);
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void delete(OpLogParam opLogParam) {
        this.removeById(opLogParam.getId());
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void edit(OpLogParam opLogParam) {
        SysOpLog sysOpLog = this.queryOpLog(opLogParam);
        BeanUtil.copyProperties(opLogParam, sysOpLog);
        this.updateById(sysOpLog);
    }

    @Override
    public SysOpLog detail(OpLogParam opLogParam) {
        return this.queryOpLog(opLogParam);
    }

    /**
     * 获取系统操作日志表
     *
     * @author hzl
     * @date 2024-07-23 09:58:00
     */
    private SysOpLog queryOpLog(OpLogParam opLogParam) {
        SysOpLog sysOpLog = this.getById(opLogParam.getId());
        if (ObjectUtil.isNull(sysOpLog)) {
            throw new ServiceException(ResultCode.INTERNAL_SERVER_ERROR);
        }
        return sysOpLog;
    }
}
